package org.wms;

import dev.langchain4j.community.model.dashscope.QwenChatModel;
import dev.langchain4j.service.AiServices;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.wms.assistant.Assistant;

/**
 * @author : 阿盛哟
 * @description :
 * 1、什么是AIService
 *      AIService使用面向接口和动态代理的方式完成程序的编写，更灵活的实现高级功能。
 * 1.1、链 Chain（旧版）
 *      链的概念源自 Python 中的 LangChain。其理念是针对每个常见的用例都设置一条链，比如聊天机器人、
 * 检索增强生成（RAG）等。链将多个底层组件组合起来，并协调它们之间的交互。链存在的主要问题是不
 * 灵活，我们不进行深入的研究。
 * 1.2、人工智能服务 AIService
 *      在LangChain4j中我们使用AIService完成复杂操作。底层组件将由AIService进行组装。
 *      AIService可处理最常见的操作：
 *          为大语言模型格式化输入内容
 *          解析大语言模型的输出结果
 *      它们还支持更高级的功能：
 *          聊天记忆 Chat memory
 *          工具 Tools
 *          检索增强生成 RAG
 * @createDate : 2025/4/30 0:26
 */
@SpringBootTest
public class AiServiceTest {

    @Autowired
    private QwenChatModel qwenChatModel;
    @Test
    public void testChat() {
        //创建AIService
        Assistant assistant = AiServices.create(Assistant.class, qwenChatModel);
        //调用service的接口
        String answer = assistant.chat("Hello");
        System.out.println(answer);
    }

    /**
     * AiServices会组装Assistant接口以及其他组件，并使用反射机制创建一个实现Assistant接口的代理对象。
     * 这个代理对象会处理输入和输出的所有转换工作。在这个例子中，chat方法的输入是一个字符串，但是大
     * 模型需要一个 UserMessage 对象。所以，代理对象将这个字符串转换为 UserMessage ，并调用聊天语
     * 言模型。chat方法的输出类型也是字符串，但是大模型返回的是 AiMessage 对象，代理对象会将其转换
     * 为字符串。
     */
    @Autowired
    private Assistant assistant;
    @Test
    public void testChat2() {
        String answer = assistant.chat("你是谁");
        System.out.println(answer);
    }


}